#include "calculator.h"
#include <thread>
#include <chrono>

napi_value Calculator::Construct(napi_env env, napi_callback_info info) {
    size_t argc = 2;
    napi_value argv[2] = {nullptr};
    napi_value jsthis = nullptr;

    napi_status status;
    status = napi_get_cb_info(env, info, &argc, argv, &jsthis, nullptr);

    int32_t age;
    char buf[4096] = {0};
    size_t len = 0;

    status = napi_get_value_int32(env, argv[0], &age);

    status = napi_get_value_string_utf8(env, argv[1], buf, 4096, &len);

    Calculator *ps = new Calculator();

    status = napi_wrap(
        env, jsthis, ps,
        [](napi_env env, void *finalize_data, void *finalize_hint) {
            delete reinterpret_cast<Calculator *>(finalize_data);
        },
        nullptr, nullptr);

    return jsthis;
}

int32_t Calculator::MyAdd(int32_t num, int32_t num2) {
    return num2 + num;
}

int32_t Calculator::MyMultiply(int32_t num, int32_t num2) {
    return num2 * num;
}

//void Calculator::asyncAdd(int32_t num, std::function<void(int32_t)> callback) {
//    // 模拟异步操作：在新线程中执行计算
//    std::thread([this, num, callback]() {
//        std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟耗时操作
//        int32_t result = base_ + num;
//        callback(result);
//    }).detach();
//}

int32_t Calculator::MyMax(int32_t a, int32_t b) {
    return a > b ? a : b;
}

// 实例方法：add（对应Calculator::add）
napi_value Calculator::Add(napi_env env, napi_callback_info info) {
    // 1. 获取JS实例对象（this）
    napi_value jsthis;
    napi_get_cb_info(env, info, nullptr, nullptr, &jsthis, nullptr);

    // 3. 解析JS传入的参数（num）
    size_t argc = 2;
    napi_value args[2] = {nullptr};
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);

    int num = 0;
    napi_get_value_int32(env, args[0], &num);
    
    int num2 = 0;
    napi_get_value_int32(env, args[1], &num);

    // 4. 调用C++实例方法
    int result = MyAdd(num, num2);

    // 5. 返回结果给JS
    napi_value jsResult;
    napi_create_int32(env, result, &jsResult);
    return jsResult;
}

// 实例方法：multiply（对应Calculator::multiply）
napi_value Calculator::Multiply(napi_env env, napi_callback_info info) {
    // 步骤与Add类似
    napi_value jsthis;
    napi_get_cb_info(env, info, nullptr, nullptr, &jsthis, nullptr);

    size_t argc = 2;
    napi_value args[2] = {nullptr};
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);

    int num = 0;
    napi_get_value_int32(env, args[0], &num);
    int num2 = 0;
    napi_get_value_int32(env, args[1], &num);

    int result = MyMultiply(num, num2);

    napi_value jsResult;
    napi_create_int32(env, result, &jsResult);
    return jsResult;
}

// 静态方法：max（对应Calculator::max）
napi_value Calculator::Max(napi_env env, napi_callback_info info) {
    // 1. 解析JS传入的参数（a和b）
    size_t argc = 2;
    napi_value args[2] = {nullptr};
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);

    int a = 0, b = 0;
    napi_get_value_int32(env, args[0], &a);
    napi_get_value_int32(env, args[1], &b);

    // 2. 调用C++静态方法
    int result = MyMax(a,b);

    // 3. 返回结果给JS
    napi_value jsResult;
    napi_create_int32(env, result, &jsResult);
    return jsResult;
}